--元表(爸爸表) 其实有点像是继承

--任何表都能成为元表 如下
meta ={} --元表
myTable ={} --子表
setmetatable(myTable,meta); --设置元表

--元表特性
--1.子表被当字符串用 会调用元表中的__tostring方法 也就是说必须返回一个字符串
meta1 = {
	__tostring = function()
				return "元表中的string"
			end
} 
myTable1 = {} 
setmetatable(myTable1,meta1); 

print(myTable1);

--当子表被当string调用 还会将自身当作第一个参数传递进入如下t0
meta2 = {
	
	__tostring = function(t0)
				return t0.name.."_"..t0.Lname
			end
} 

--这里提出一个问题 如果把name ="小明",Lname = "明明"写在元表里面 能否打印出来呢?
--如果不行 那该如何去实现?后面的__index会揭晓打答案
myTable2 = {name ="小明",Lname = "明明"} 
setmetatable(myTable2,meta2); 

print(myTable2); 	

--2.如果想让表当作函数使用 就需要在元表写个__call
meta3 ={

	__call = function(a,b)
		print("子表被当作函数使用 并可以传递参数 18 + 2 ="..a.age+b);
	end

} 
myTable3 ={
	age = 18;
} 
setmetatable(myTable3,meta3);

myTable3(2); --这里也是将自身作为第一个参数传递给a了


--3.运算符重载 一大堆
meta4 ={
	__add = function(t0,t1)
		return t0.age + t1.age
	end
	--__sub -
	--__mul *
	--__div /
	--__mod %
	--__pow ^
	--__eq ==
	--__lt <
	--__le <=
	--__concat ..(拼接)
	-->和>=就是颠倒一下lt 和 le即可
} 
myTable4F ={age = 18}
myTable4S ={age = 30}

--条件运算符 需要子表都有相同的元表
setmetatable(myTable4F,meta4);
setmetatable(myTable4S,meta4);

print("18 + 30 ="..myTable4F + myTable4S);

--4.核心操作 __index 和 __newindex 类似指针(或者路径箭头) 起到重定向的功能

--如果在--使用(只读)--的时候 子表找不到一个属性 会去元表找__index指向的表去找属性
meta5 ={} --元表
myTable5 ={} --子表
DataTable1 ={
	age = 100,
	sex = true,
	name = "小红"
} --数据表

--定向
meta5.__index =DataTable1
setmetatable(myTable5,meta5);

print("下面是从数据表里面找的数据\n"..
	"年龄:"..myTable5.age..
	"\n性别:"..tostring(myTable5.sex)..
	"\n姓名:"..myTable5.name); 


--如果在--赋值(只写)--的时候 子表没有这个属性 会去元表找__newindex指向的表设置属性

meta6 ={} --元表
myTable6 ={} --子表
DataTable2 ={
	age = 100,
	sex = true,
	name = "小红"
} --数据表

--定向
meta5.__newindex =DataTable2
setmetatable(myTable6,meta6);

myTable6.age =1000;
myTable6.sex =false;
myTable6.name ="小蓝";

print("下面是从数据表里设置的新数据\n"..
	"年龄:"..myTable6.age..
	"\n性别:"..tostring(myTable6.sex)..
	"\n姓名:"..myTable6.name); 

--其他不常用方法
--1.就要子表的属性(如果有,没有则报错) 忽略__index 和 __newindex

meta7 ={} --元表
myTable7 ={age = 114514} --子表
DataTable3 ={
	age = 100,
} --数据表

--定向
meta7.__index =DataTable3

setmetatable(myTable7,meta7);

print("这里会打印myTable7自己的114514:"..rawget(myTable7,"age")); 
rawset(myTable7,"age",255) 
print("这里会把myTable7的114514改为255:"..myTable7.age);
--注意不是print(rawset(myTable7,"age",255) ); 因为rawset的返回值是表号
--2.获取子表的元表号
print(getmetatable(myTable7));